﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIMCObjetoNegocio;

namespace SIMCPresenter
{

    public interface IComposicionPortafolioPresenterView
    {
        event EventHandler<EventArgs> Iniciar;
        event EventHandler<EventArgs> BuscarPosiciones;
        int PortafolioID { get;}
        DateTime FechaPortafolio { get; }
        Portafolio DatosPortafolio { set; }
        string UsuarioExterno { get; }
      
        Dictionary<string, string> FiltroActivoPasivo { set; }
        string ActivoPasivoSeleccionado { get; }

        Dictionary<string,string> FiltroDivisa { set; }
        string DivisaSeleccionada { get; }

        Dictionary<string,string> FiltroTipoPosicion { set; }
        string TipoPosicionSeleccionado { get; }


        IList<PortafolioBalancePosicion> Activos { set; }

        IList<PortafolioBalancePosicion> Pasivos { set; }
        
    }

    public class ComposicionPortafolioPresenter
    {
        private IComposicionPortafolioPresenterView mView;

        public ComposicionPortafolioPresenter(IComposicionPortafolioPresenterView view)
        {
            this.mView = view;
            this.Initialize();
        }

        private void Initialize()
        {
            this.mView.BuscarPosiciones += new EventHandler<EventArgs>(mView_BuscarPosiciones);
            this.mView.Iniciar += new EventHandler<EventArgs>(mView_Iniciar);
        }

        void mView_Iniciar(object sender, EventArgs e)
        {
            SIMCFachadaNegocio.FachadaPortafolio fachada = new SIMCFachadaNegocio.FachadaPortafolio();
            if (mView.UsuarioExterno != null)
            {
                PortafolioSearchCriteria criterio = new PortafolioSearchCriteria(mView.FechaPortafolio) { IdPortafolio = mView.PortafolioID, NombreUsuarioExterno = mView.UsuarioExterno };
                mView.DatosPortafolio = fachada.BuscarPortafolioExterno(criterio);
            }
            else
            {
                mView.DatosPortafolio = fachada.BuscarPortafolio(mView.PortafolioID, mView.FechaPortafolio);
            }                                                    

            IList<PortafolioBalancePosicion> posiciones = CrearListPosiciones(fachada);
            LlenarFiltros(posiciones, fachada);
            GenerarPosiciones(mView.PortafolioID, posiciones, fachada);
        }        

        private IList<PortafolioBalancePosicion> CrearListPosiciones(SIMCFachadaNegocio.FachadaPortafolio fachada)
        {
            PortafolioBalancePosicionSearchCriteria criterio = new PortafolioBalancePosicionSearchCriteria(mView.PortafolioID)
            {
                AP = (mView.ActivoPasivoSeleccionado != "0") ? mView.ActivoPasivoSeleccionado : string.Empty,
                divisa = (mView.DivisaSeleccionada != "0") ? mView.DivisaSeleccionada : string.Empty,
                tipoPosicion = (mView.TipoPosicionSeleccionado != "0") ? mView.TipoPosicionSeleccionado : string.Empty
            };

            return fachada.BuscarListaPosiciones(criterio, mView.FechaPortafolio);
        }

        private void LlenarFiltros(IList<PortafolioBalancePosicion> posiciones, SIMCFachadaNegocio.FachadaPortafolio fachada)
        {
            LLenarActivoPasivo(posiciones);
            LlenarDivisas(posiciones);
            LlenarTipoPosiciones(posiciones);
        }

        private void LlenarTipoPosiciones(IList<PortafolioBalancePosicion> posiciones)
        {
            Dictionary<string, string> dicTipos = new Dictionary<string, string>();
            dicTipos.Add("0", "Sin filtro");

            foreach (PortafolioBalancePosicion pos in posiciones)
            {
                if (!dicTipos.ContainsKey(pos.TipoGenerico))
                {
                    dicTipos.Add(pos.TipoGenerico, pos.TipoGenericoEnum.Imprimir());
                }
            }

            mView.FiltroTipoPosicion = dicTipos;
        }

        private void LlenarDivisas(IList<PortafolioBalancePosicion> posiciones)
        {
            Dictionary<string, string> dicDivisa = new Dictionary<string, string>();
            dicDivisa.Add("0", "Sin filtro");

            foreach (PortafolioBalancePosicion pos in posiciones)
            {
                if (!dicDivisa.ContainsKey(pos.DivisaPosicion))
                {
                    dicDivisa.Add(pos.DivisaPosicion, pos.DivisaPosicion);
                }
            }

            mView.FiltroDivisa = dicDivisa;
        }

        private void LLenarActivoPasivo(IList<PortafolioBalancePosicion> posiciones)
        {            

            int cantPasivos = (from valor in posiciones
                               where valor.APEnum == ActivoPasivo.Pasivo
                               select valor).Count();

            Dictionary<string, string> lista = new Dictionary<string, string>();
            lista.Add("0", "Sin filtro");
            if (cantPasivos > 0)
            {
                lista.Add("P", "Pasivo");
            }

            int cantActivos = (from valor in posiciones
                               where valor.APEnum == ActivoPasivo.Activo
                               select valor).Count();

            if (cantActivos > 0)
            {
                lista.Add("A","Activo");
            }

            mView.FiltroActivoPasivo = lista;
        }

        private void GenerarPosiciones(int idPortafolio, IList<PortafolioBalancePosicion> posiciones, SIMCFachadaNegocio.FachadaPortafolio fachada)
        {
            if (posiciones != null)
            {
                mView.Activos = posiciones.FiltrarActivoPasivo(ActivoPasivo.Activo);
                mView.Pasivos = posiciones.FiltrarActivoPasivo(ActivoPasivo.Pasivo);
            }
        }

        private void mView_BuscarPosiciones(object sender, EventArgs e)
        {
            try
            {
                SIMCFachadaNegocio.FachadaPortafolio fachada = new SIMCFachadaNegocio.FachadaPortafolio();
                IList<PortafolioBalancePosicion> posiciones = CrearListPosiciones(fachada);
                GenerarPosiciones(mView.PortafolioID, posiciones, fachada);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
                throw;
            }
        }


    }


}
